//
// Created by Arnold on 2021/5/18.
//

#ifndef FRAME_UTIL_H
#define FRAME_UTIL_H


#include "crc.h"

typedef struct
{
    uint16_t dev_num; //设备编号
	uint8_t type;           //命令类型  0x01 同步定时器； 0x02 设置休眠唤醒配置； 0x03 休眠唤醒指令；0x04 电源状态数据；0x05 控制信息;
    uint16_t len;
    uint8_t data[128];
} LoraData;

typedef struct
{
    uint8_t start;     //数据帧头
	uint8_t type;       //帧类型;
    uint16_t len;       //帧长度
    uint16_t crc;
    uint8_t end;        //帧尾
    uint8_t data[128];
} t_FrameData;

/**
 * @brief 查找数据包里面的结束字符位置
 * 
 * @param str 原始数据缓冲区
 * @param c 结束字符
 * @param len 原始数据长度
 * @return uint8_t* 找到字符后返回其后部分（包括结尾的空字符）
 */
uint8_t* find_substring(uint8_t *str, uint8_t c, uint16_t len);

/**
 * @brief 解析数据帧，把解决装到结构体数据里面
 * 
 * @param input 需要解析的数据帧
 * @param length 解析的数据长度
 * @return t_FrameData 解析后的结构体数据
 */
t_FrameData * parse_frame(uint8_t *input, uint16_t length);

/**
 * @brief 把结构体数据帧转化为数据帧
 * 
 * @param t_FrameData 需要解析的数据帧
 * @param out_len 解析的数据长度
 * @return 返回结果数据帧，调用者使用后，需要释放内存
 */
uint8_t *unparse_frame(t_FrameData *frame, int *out_len);

#endif //FRAME_UTIL_H
